package com.igda.tihbms.controllers;

import java.util.logging.Level;
import java.util.logging.Logger;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.SurfaceHolder;

public class PaintThread extends Thread {

	private SurfaceHolder surfaceHolder;
	private Paint mLinePaint;
	private Paint blackPaint;
	private LogicController logic;

	private long sleepTime;
	private static final long delay = 70;

	public PaintThread(Context context, SurfaceHolder holder,
			LogicController logic) {
		this.surfaceHolder = holder;

		//standard game painter. Used to draw on the canvas
		mLinePaint = new Paint();
		mLinePaint.setARGB(255, 0, 255, 0);
		//black painter below to clear the screen before the game is rendered
		blackPaint = new Paint();
		blackPaint.setARGB(255, 0, 0, 0);
		//mLinePaint.setAntiAlias(true);

		this.logic = logic;
	}

	//This is the most important part of the code. It is invoked when the call to start() is
	//made from the SurfaceView class. It loops continuously until the game is finished or
	//the application is suspended.
	@Override
	public void run() {

		while (this.logic.getState() == LogicController.GameStates.PLAYING) {
			//time before update
			long beforeTime = System.nanoTime();
			//This is where we update the game engine
			logic.update();

			//DRAW
			Canvas c = null;
			try {
				//lock canvas so nothing else can use it
				c = surfaceHolder.lockCanvas(null);
				synchronized (surfaceHolder) {
					//clear the screen with the black painter.
					c.drawRect(0, 0, c.getWidth(), c.getHeight(), blackPaint);
					//This is where we draw the game engine.
					logic.draw(c);
				}
			} finally {
				// do this in a finally so that if an exception is thrown
				// during the above, we don't leave the Surface in an
				// inconsistent state
				if (c != null) {
					surfaceHolder.unlockCanvasAndPost(c);
				}
			}

			//SLEEP
			//Sleep time. Time required to sleep to keep game consistent
			//This starts with the specified delay time (in milliseconds) then subtracts from that the
			//actual time it took to update and render the game. This allows our game to render smoothly.
			this.sleepTime = delay
					- ((System.nanoTime() - beforeTime) / 1000000L);

			try {
				//actual sleep code
				if (sleepTime > 0) {
					Thread.sleep(sleepTime);
				}
			} catch (InterruptedException ex) {
				Logger.getLogger(PaintThread.class.getName()).log(Level.SEVERE,
						null, ex);
			}
		}

	}
}